/**
 * Created With IntelliJ IDEA
 * Description:牛客网: BM93 盛水最多的容器
 * <a href="https://www.nowcoder.com/practice/3d8d6a8e516e4633a2244d2934e5aa47?tpId=295&tqId=2284579&ru=/exam/company&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Fcompany">...</a>
 * User: DELL
 * Data: 2023-05-01
 * Time: 23:20
 */
public class Solution {
    /**
     * 解题思路 (贪心算法+双指针)
     * 因为容积与最短边长和底边长有关，与长的底边一定以首尾为边，但是首尾不一定够高，
     * 中间可能会出现更高但是底边更短的情况，因此我们可以使用对撞双指针向中间靠，这
     * 样底边长会缩短，因此还想要有更大容积只能是增加最短变长，此时我们每次指针移动
     * 就移动较短的一边，因为贪心思想下如果出现更大体积的容器,那么一定是移动较短边
     * 之后出现的,因为如果移动的是较长边,那么下一条边即使很长,容器的高度也没变.
     * 当两边相等的时候移动左右任意一条边即可.
     * @param height
     * @return
     */
    public int maxArea (int[] height) {
        //检验 height 数组的合法性
        if (height == null || height.length < 2) {
            return 0;
        }
        int left = 0;
        int right = height.length-1;
        int max = 0;
        while (left < right) {
            max = Math.max(max,Math.min(height[left],height[right])*(right-left));
            if (height[left] <= height[right]) {
                left++;
            } else {
                right--;
            }
        }
        return max;
    }
}